<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>

</head>
<body>

</body>
</html>
<script>
// 函数中的 this 指向问题
  // 总结：
    // 谁调用函数，则函数中的 this 指向谁；
    // 若 没有 任何对象调用函数，函数中的 this 指向 window （非 严格模式 下） - 严格模式下 this 指向 undefined
  // 举个例子
    // 1. xx.fn()  若 fn 中有 this ，则 this 指向 xx 这个对象
    // 2. fn() 直接调用  或 setInterval(fn, xxms);   这个时间 fn 中的 this 指向 window

function say() {
  console.log('say', this);
}

// say(); // 指向 window

const o = {
  name: 'obj',
  say: say
}

// o.say(); // 指向 o

// setTimeout(o.say, 1000); // 指向 window
// setTimeout(say, 1000); // 指向 window

// -------------------------------------

// 改变 this 的指向
// setTimeout(o.say.bind(o), 1000) // 改变了 函数 say 的 指向， 指向 o


/* 回顾 改变 函数 this 指向的三种方法：
  fn.call(context, 参数1, 参数2, ...)
    // 1. 直接指向函数 fn;  2. 将 fn 中 this 指向 context

  fn.apply(context, [参数1, 参数2, ...])
    // 用法与 call 一致，除了 所有的参数都放到 数组里面

  fn.bind(context, 参数1, 参数2, ...);
    // 1. bind 不执行函数 fn， 返回一个新的函数 表达式；
    // 2. 若有 参数1.. ，将这些参数“封装”到新的返回函数当中
*/

</script> 